## Задача 1 Генератор паролей

Объявите класс `RandomPassword` для генерации случайных паролей. 

Объекты этого класса должны создаваться командой:

```python
rnd = RandomPassword(psw_chars, min_length, max_length)
```
где:
`psw_chars` - строка из разрешенных в пароле символов;
` min_length, max_length` - минимальная и максимальная длина генерируемых паролей.

Непосредственная генерация одного пароля должна выполняться командой:

```python
psw = rnd()
```
где psw - ссылка на строку длиной в диапазоне `[min_length; max_length]` из случайно выбранных символов строки `psw_chars`.

С помощью генератора списка `(list comprehension)` создайте список `lst_pass` из трех сгенерированных паролей объектом `rnd` класса `RandomPassword`, созданного с параметрами: 

```python
min_length = 5
max_length = 20
psw_chars = "qwertyuiopasdfghjklzxcvbnm0123456789!@#$%&*"

```
> Заготовка для задачи

```python
class RandomPassword:

    def __init__(self, psw_chars, min_length, max_length):
        ...

    def __call__(self):
       ...  
       return ...
```
Вывести на экран список паролей.

## Задача 2 Обработка файлов

Для последовательной обработки файлов из некоторого списка, например:

```python
filenames = ["boat.jpg", "web.png", "text.txt", "python.doc", "ava.8.jpg", "forest.jpeg", "eq_1.png", "eq_2.png", "my.html", "data.shtml"]

```
Необходимо объявить класс `ImageFileAcceptor`, который бы выделял только файлы с указанными расширениями.

Для этого предполагается создавать объекты класса командой:

```python
acceptor = ImageFileAcceptor(extensions)
```

где `extensions` - кортеж с допустимыми расширениями файлов, например: 

`extensions = ('jpg', 'bmp', 'jpeg')`

А, затем, использовать объект acceptor в стандартной функции filter языка Python следующим образом:

```python
image_filenames = filter(acceptor, filenames)
```

Пример использования класса:


```python
filenames = ["boat.jpg", "web.png", "text.txt", "python.doc", "ava.jpg", "forest.jpeg", "eq_1.png", "eq_2.png"]
acceptor = ImageFileAcceptor(('jpg', 'bmp', 'jpeg'))
image_filenames = filter(acceptor, filenames)
print(list(image_filenames))  # ["boat.jpg", "ava.jpg", "forest.jpeg"]
```


## Задача 3 Преобразователь типов


Объявите класс `DigitRetrieve` для преобразования данных из строки в числа. 

Объекты этого класса создаются командой:
```python
dg = DigitRetrieve()

# их предполагается использовать, например следующим образом:

d1 = dg("123")   # 123 (целое число)
d2 = dg("45.54")   # None (не целое число)
d3 = dg("-56")   # -56 (целое число)
d4 = dg("12fg")  # None (не целое число)
d5 = dg("abc")   # None (не целое число)
```

То есть, целые числа в строке следует приводить к целочисленному типу данных, а все остальные - к значению `None`.

С помощью объектов класса DigitRetrieve должно выполняться преобразование чисел из списка строк следующим образом:

```python
st = ["123", "abc", "-56.4", "0", "-5"]
digits = list(map(dg, st))  # [123, None, None, 0, -5]
```


## Задача 4. Имеется лог-файл `crm_log.txt` с информацией о времени входа пользователей в CRM-систему и о времени выхода. 
Напишите программу в ОО-стиле, которая определяет пользователей, работавших в системе более 4 часов, и записывает их имена и фамилии в файл best_employees.txt.

Пример лога `crm_log.txt`:

```        
Егор Тимофеев, 09:10, 16:50
Марина Абрамова, 12:00, 15:59
Никита Круглов, 09:10, 12:45
Анна Семенова, 08:10, 12:30
Юлия Сафонова, 10:10, 10:50
Михаил Колесников, 11:10, 12:10
```
    
Выходные данные в файле `best_employees.txt`:

```        
Егор Тимофеев
Анна Семенова
```
